package www.my.imageframecompare.drawableUtil;

import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.support.annotation.IntRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by 张英杰 on 2017/10/18.
 */

public class RoundImageDrawable extends Drawable {
    private Paint mPaint;
    private Bitmap mBitmap;
    private int mRoundSize;

    private Rect rectF;

    public RoundImageDrawable(@NonNull Bitmap mBitmap) {
        this(mBitmap,50);
    }

    public RoundImageDrawable(@NonNull Bitmap mBitmap, int mRoundSize) {
        this.mBitmap = mBitmap;
        this.mRoundSize=mRoundSize;
//        BitmapShader的作用是使用特定的图片来作为纹理来使用。
//        public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY)
//        三个参数：bitmap 指的是要作为纹理的图片，tileX 指的是在ｘ方向纹理的绘制模式，tileY 指的是Ｙ方向上的绘制模式。
//
//        TileMode 是一个枚举类型，有３个可能的值：
//        CLMP 如果需要填充的内容大小超过了bitmap size 就选bitmap 边界的颜色进行扩展
//        REPEAT重复，不断的重复bitmap去填满，如果绘制的区域大于纹理图片的话，纹理图片会在这片区域不断重复
//        MIRROR镜像的去填满。如果绘制的区域大于纹理图片的话，纹理图片会以镜像的形式重复出现
        BitmapShader bitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setShader(bitmapShader);
    }

    private static final String TAG = "RoundImageDrawable==";
    @Override
    public void setBounds(@NonNull Rect bounds) {
        super.setBounds(bounds);
        rectF = new Rect(bounds);
        Log.i(TAG, "setBounds: "+(rectF==null));
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        Log.i(TAG, "draw: "+(rectF==null));
        if (rectF==null){
            //就是去设置下绘制的范围。
            rectF = getBounds();
        }
        canvas.drawRoundRect(new RectF(rectF.left,rectF.top,rectF.right,rectF.bottom), mRoundSize,mRoundSize,mPaint);
    }

    //etIntrinsicWidth、getIntrinsicHeight
    // 主要是为了在View使用wrap_content的时候，提供一下尺寸，默认为-1可不是我们希望的
    @Override
    public int getIntrinsicHeight() {
        return mBitmap.getHeight();
    }

    @Override
    public int getIntrinsicWidth() {
        return mBitmap.getWidth();
    }

    @Override
    public void setAlpha(@IntRange(from = 0, to = 255) int i) {
        mPaint.setAlpha(i);
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}
